#pragma once
//文件类型
#define BINFILE 0;
#define ASCFILE 1;

//命令
#define LS 1
#define PWD 2
#define CD 3
#define PUT 4
#define GET 5
#define MKDIR 6
#define RMDIR 7
#define DELETE 8
#define QUIT 9
#define LPWD 10
#define LLS 11
#define LCD 12
#define CHMOD 13
#define HELP 14
#define ERROR -1
#define NO_AUTH -2

// FTP 工作方式mode
/*
        Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接，通过这个通道发送命令，
        客户端需要接收数据的时候在这个通道上发送PORT命令。
        PORT命令包含了客户端用什么端口接收数据。在传送数据的时候，服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。
        FTP server必须和客户端建立一个新的连接用来传送数据。
        这种方式下是客户端和服务器建立控制连接，服务器向客户端建立数据连接，
        其中，客户端的控制连接和数据连接的端口号是大于1024的两个端口号（临时端口），
        而FTP服务器的数据端口为20，控制端口为21
*/
#define PORT 0 //主动模式，客户端发送PORT命令到服务器
/*
Passive模式在建立控制通道的时候和Port模式类似，但建立连接后发送的不是Port命令，而是Pasv命令。
FTP服务器收到Pasv命令后，随机打开一个临时端口（也叫自由端口，端口号大于1023小于65535），并且通知客户端在这个端口上传送数据的请求。
客户端连接FTP服务器此端口，然后FTP服务器将通过这个端口进行数据的传送，这个时候FTP server不再需要建立一个新的和客户端之间的连接。

这种情况下的连接都是由客户端向服务器发起的
*/
#define PASV 1 //被动模式，客户端发送PASV命令到服务器

//服务器返回消息
static char serverInfo220[] = "220 myFTP Server ready...\r\n";
static char serverInfo230[] = "230 User logged in, proceed.\r\n";
static char serverInfo331[] = "331 User name okay, need password.\r\n";
static char serverInfo221[] = "221 Goodbye!\r\n";
static char serverInfo150[] = "150 File status okay; about to open data connection.\r\n";
static char serverInfo226[] = "226 Closing data connection.\r\n";
static char serverInfo200[] = "200 Command okay.\r\n";
static char serverInfo215[] = "215 Unix Type FC5.\r\n";
static char serverInfo213[] = "213 File status.\r\n";
static char serverInfo211[] = "211 System status, or system help reply.\r\n";
static char serverInfo350[] = "350 Requested file action pending further information.\r\n";
static char serverInfo530[] = "530 Not logged in.\r\n";
static char serverInfo531[] = "531 Not root client. Anonymous client.\r\n";
static char serverInfo441[] = "441 File_type wrong.\r\n";
static char serverInfo425[] = "425 Something is wrong, can't start the active connection... \r\n";
static char serverInfo227[] = "227 Entering Passive Mode\r\n";
static char serverInfo[] = "202 Command not implemented, superfluous at this site.\r\n";

//其它配置信息
#define FPT_SERVER_PORT 21
#define MAX_INFO 1024
#define DIR_INFO 100
#define MSG_INFO 100
#define LISTEN_QENU 5
#define MAX_LISTEN 20 //同时进行最大监听数

//复制时保留文件的位序，逐位拷贝原始文件而不管内容
#define BINARY 0
//复制时候会进行调整，主要体现为对不同操作系统的回车/换行/结束符等进行转译。
//假定用户正在拷贝的文件包含的简单ASCII码文本，如果在远程机器上运行的不是UNIX，
//当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
#define ASCII 1

typedef struct Msg
{
        int file_type;
        int mode;                    //用于区分PORT和PASV
        int ftp_control_sock;        //端口控制sock
        int ftp_data_sock;           //端口数据sock, (文件传输通道), PORT模式下您需要给我一个新的sock
        char control_info[MAX_INFO]; //控制信息
} Msg;
